﻿using Common;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using StudentManager.API.ViewMode;
using StudentManager.Data.DAL;
using StudentManager.Data.IDAL;
using StudentManager.Data.Model;

namespace StudentManager.API.BLL
{
    /// <summary>
    /// 业务逻辑层（Business Object），负责处理学生相关的业务逻辑
    /// </summary>
    [Service(EServLife.Scoped)] // 依赖注入的生命周期设为 Scoped，确保每个请求获得独立实例
    public class StudentBO(IStudentDAO studentDAO)
    {
        #region 添加单条学生信息
        /// <summary>
        /// 添加单条学生信息
        /// </summary>
        /// <param name="model">学生信息模型</param>
        /// <returns>操作结果</returns>
        public IResult Insert(StudentInfo model)
        {
            // 创建一个新的 Student 实例，并将 StudentInfo 模型中的数据赋值给它
            var record = new Student
            {
                StudentNo = model.StudentNo, // 学生学号
                Name = model.Name, // 学生姓名
                Password = model.Password, // 学生密码
                Mobile = model.Mobile, // 学生手机号码
                Grade = model.Grade, // 学生年级
                Major = model.Major, // 学生专业
                Class = model.Class, // 学生班级
                Sex = model.Sex, // 学生性别
                Photo = model.Photo, // 学生照片
            };

            // 调用数据访问层（DAL）插入学生记录，并获取插入操作的影响行数
            int ret = studentDAO.Insert(record);

            // 返回操作结果，包含新插入的学生ID和操作状态码
            return ret > 0 ? Result.OK("添加成功", new { record.StudentID }) : Result.Fail("添加失败");
        }
        #endregion

        #region 修改单条学生信息
        /// <summary>
        /// 修改单条学生信息
        /// </summary>
        /// <param name="model">学生信息模型</param>
        /// <returns>操作结果</returns>
        public IResult Update(StudentInfo model)
        {
            // 根据 StudentID 获取数据库中的原始学生数据
            var record = studentDAO.GetInfo(model.StudentID);

            // 如果未找到对应的学生记录，则返回失败结果
            if (record == null) return Result.Fail("学生信息不存在");

            // 更新学生数据字段
            record.StudentNo = model.StudentNo; // 学生学号
            record.Name = model.Name; // 学生姓名
            record.Mobile = model.Mobile; // 学生手机号码
            record.Grade = model.Grade; // 学生年级
            record.Major = model.Major; // 学生专业
            record.Class = model.Class; // 学生班级
            record.Sex = model.Sex; // 学生性别
            record.Photo = model.Photo; // 学生照片

            // 调用数据访问层（DAL）更新学生记录，并获取受影响行数
            int ret = studentDAO.Update(record);

            // 返回操作结果，包含修改的学生ID和操作状态码
            return ret > 0 ? Result.OK("修改成功", new { record.StudentID }) : Result.Fail("修改失败");
        }
        #endregion

        #region 删除单条学生信息
        /// <summary>
        /// 删除单条学生信息
        /// </summary>
        /// <param name="studentID">学生ID</param>
        /// <returns>操作结果</returns>
        public IResult Delete(int studentID)
        {
            // 调用数据访问层（DAL）删除指定学生信息
            var res = studentDAO.Delete(studentID);

            // 以统一格式返回数据
            return Result.Data(res);
        }
        #endregion

        #region 查询单条学生信息
        /// <summary>
        /// 查询单条学生信息
        /// </summary>
        /// <param name="studentID">学生ID</param>
        /// <returns>学生信息</returns>
        public IResult GetInfo(int studentID)
        {
            // 调用数据访问层（DAL）获取指定学生信息
            var res = studentDAO.GetInfo(studentID);

            // 以统一格式返回数据
            return Result.Data(res);
        }
        #endregion

        #region 多条件查询单条学生信息
        /// <summary>
        /// 多条件查询单条学生信息
        /// </summary>
        /// <param name="studentID">学生ID</param>
        /// <returns>学生信息</returns>
        public IResult GetInfo(JObject condition)
        {
            // 根据条件构建查询语句的条件
            var where = BllHelper.GetStudentSQLWhere(condition);

            // 将条件转换为参数对象
            var param = BllHelper.ToParamObj(condition);

            // 调用数据访问层（DAL）获取指定学生信息
            var res = studentDAO.GetInfo(where, param);

            // 以统一格式返回数据
            return Result.Data(res);
        }
        #endregion

        #region 获取所有学生信息
        /// <summary>
        /// 获取所有学生信息
        /// </summary>
        /// <returns>学生列表</returns>
        public IResult GetAllList(JObject? condition)
        {
            // 根据条件构建查询语句的条件
            var where = BllHelper.GetStudentSQLWhere(condition);

            // 将条件转换为参数对象
            var param = BllHelper.ToParamObj(condition);

            // 调用数据访问层（DAL）获取所有学生数据
            var list = studentDAO.GetList(where, param);

            // 以统一格式返回数据
            return Result.Data(list);
        }
        #endregion

        #region 分页查询学生信息
        /// <summary>
        /// 分页查询学生信息
        /// </summary>
        /// <param name="pageIndex">当前页索引</param>
        /// <param name="pageSize">每页显示的记录数</param>
        /// <param name="condition">查询条件</param>
        /// <returns>分页学生列表</returns>
        public IResult PagedList(int pageIndex, int pageSize, dynamic? condition=null)
        {
            // 根据条件构建查询语句
            var where = BllHelper.GetStudentSQLWhere(condition);

            // 将条件转换为参数对象
            var param = BllHelper.ToParamObj(condition);

            // 调用数据访问层（DAL）获取分页数据
            var list = studentDAO.GetList(pageIndex, pageSize, where, param);

            // 以统一格式返回数据
            return Result.Data(list);
        }
        #endregion
    }
}
